export { }
// 抽象类与抽象类的抽象方法
// 1. 定义2个不同的接口数据类型
interface Eat {
  eat(food: string): void
}
interface Run {
  run(runName: string): void
}

// 把Animal定义为抽象类：不可以使用new来创建实例化对象。
// abstract,定义抽象类的关键字
abstract class Animal implements Eat, Run {
  name:string
  constructor(name:string) {
    this.name = name
  }

  eat(food: string): void {
    
  }
  run(runName: string): void {
    console.log(this.name+"喜欢"+runName);
    
  }
  // 定义一个抽象的方法
  //抽象类中的抽象方法不包含具体实现并且必须在派生类（子类）中实现。
  // 抽象方法的语法与接口方法相似。 两者都是定义方法签名但不包含方法体。 
  //然而，抽象方法必须包含 abstract关键字并且可以包含访问修饰符。
  abstract jump (count:number):void
}

// let dog = new Animal('小哈') // 无法创建抽象类的实例。

// 创建Dog子类，并继承Animal (抽象类)父类,实例化对象拥有父类里面的属性和方法
class Dog extends Animal{
  constructor(name:string){
    super(name)
  }
  // 子类里面，实现了父类中 jump 抽象方法
  jump(count: number): void {
    console.log(this.name+ '每天拆家'+count + '次');
  }
}

// 子类可以实例化
let hsq = new Dog('哈士奇')
hsq.run('拆家') // 哈士奇喜欢拆家
hsq.jump(5000)
